home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Scene 96
/
Scene 96 International Edition (Zyklop Software) (Disc 2) (1997).iso
/
misc
/
coding
/
ct_xmp15
/
xm2mxm.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
1996-09-15
|
22KB
|
801 lines
// XM 2 MXM converter, (c) 95/96 Niklas Beisert / pascal
#include <conio.h>
#include <string.h>
#include <io.h>
#include <fcntl.h>
#include <sys\stat.h>
#include <stdlib.h>
unsigned char patbuf1[0x20000];
unsigned long patofs[256];
unsigned long insofs[128];
unsigned char insreloc[256];
struct
{
unsigned long srcofs;
unsigned long dstofs;
unsigned long len;
unsigned long loopstart;
unsigned long loopend;
unsigned char type;
} sampinfo[2048];
void writestrbool(int f, char *s, int b)
{
write(f, s, strlen(s));
write(f, b?"=1\r\n":"=0\r\n", 4);
}
void main(int argc, char **argv)
{
cputs(" XM to MXM converter v1.5 (c) '95/96 Niklas Beisert / pascal\r\n\n");
int i,j,k;
char spath[_MAX_PATH];
char dpath[_MAX_PATH];
char ipath[_MAX_PATH];
*spath=0;
*dpath=0;
unsigned char pantype=0;
int dodelta=1;
int include=0;
for (i=1; i<argc; i++)
{
if ((argv[i][0]=='/')||(argv[i][0]=='-'))
{
if ((argv[i][1]&~0x20)=='P')
{
pantype=argv[i][2]-'0';
if (pantype>5)
{
cputs("invalid panning type!\r\n");
return;
}
}
else
if ((argv[i][1]&~0x20)=='D')
dodelta=0;
else
if ((argv[i][1]&~0x20)=='I')
include=1;
else
{
cputs("invalid switch!\r\n");
return;
}
}
else
{
if (!*spath)
strcpy(spath, argv[i]);
else
if (!*dpath)
strcpy(dpath, argv[i]);
else
{
cputs("invalid parameter!\r\n");
return;
}
}
}
if (!*spath)
{
cputs("xm2mxm [switches] source [dest]\r\n");
cputs(" switches:\r\n");
cputs(" -p0: XM-panning (instruments) (default)\r\n");
cputs(" -p1: MOD-panning (LRRLLRRL)\r\n");
cputs(" -p2: MOD-panning (less extreme)\r\n");
cputs(" -p3: S3M-panning (LRLRLRLR)\r\n");
cputs(" -p4: S3M-panning (less extreme)\r\n");
cputs(" -p5: 0-panning (MMMMMMMM)\r\n");
cputs(" -d: do not use delta value samples\r\n");
cputs(" -i: generate effects include file\r\n");
return;
}
char name[_MAX_FNAME];
char ext[_MAX_EXT];
char dir[_MAX_DIR];
char drive[_MAX_DRIVE];
_splitpath(spath, drive, dir, name, ext);
if (!*ext)
strcpy(ext, ".xm");
_makepath(spath, drive, dir, name, ext);
char name2[_MAX_FNAME];
_splitpath(dpath, drive, dir, name2, ext);
if (!*name2)
strcpy(name2, name);
if (!*ext)
strcpy(ext, ".mxm");
_makepath(dpath, drive, dir, name2, ext);
_makepath(ipath, drive, dir, name2, ".inc");
int file=open(spath, O_RDONLY|O_BINARY);
if (file<0)
{
cputs("could not open input file\r\n");
return;
}
struct
{
char sig[17];
char name[20];
char whythis1a;
char tracker[20];
unsigned short ver;
unsigned long hdrsize;
} head1;
struct
{
unsigned short ordnum;
unsigned short restart;
unsigned short channum;
unsigned short patnum;
unsigned short insnum;
unsigned short freqtab;
unsigned short tempo;
unsigned short speed;
unsigned char ord[256];
} head2;
read(file, &head1, sizeof(head1));
if (memcmp(head1.sig, "Extended Module: ", 17))
return;
if (head1.whythis1a!=0x1a)
return;
if (head1.ver<0x104)
return;
read(file, &head2, sizeof(head2));
lseek(file, sizeof(head1)+head1.hdrsize-4, SEEK_SET);
int addcleanpat=0;
for (i=0; i<head2.ordnum; i++)
if (head2.ord[i]>=head2.patnum)
{
head2.ord[i]=head2.patnum;
addcleanpat=1;
}
memset(head2.ord+head2.ordnum, 0, 256-head2.ordnum);
int wf=open(dpath, O_WRONLY|O_BINARY|O_TRUNC|O_CREAT, S_IREAD|S_IWRITE);
if (file<0)
{
cputs("could not open output file\r\n");
return;
}
struct
{
unsigned long sig;
unsigned long ordnum;
unsigned long restart;
unsigned long channum;
unsigned long patnum;
unsigned long insnum;
unsigned char tempo;
unsigned char speed;
unsigned short opt;
unsigned long sampstart;
unsigned long samples8;
unsigned long samples16;
signed long lowpitch;
signed long highpitch;
unsigned char panpos[32];
} mxmhead;
if (!head2.channum||!head2.ordnum||!head2.patnum)
{
cputs("no channels/orders/patterns\r\n");
return;
}
if (head2.restart>head2.ordnum)
head2.restart=0;
memset(&mxmhead, 0, sizeof(mxmhead));
mxmhead.sig=*(unsigned long*)"MXM\0";
mxmhead.ordnum=head2.ordnum;
mxmhead.restart=head2.restart;
mxmhead.channum=head2.channum;
mxmhead.insnum=head2.insnum;
mxmhead.patnum=head2.patnum+addcleanpat;
mxmhead.tempo=head2.tempo;
mxmhead.speed=head2.speed;
mxmhead.opt=(head2.freqtab&1)|(pantype?2:0)|(dodelta?4:0);
switch (pantype)
{
case 0: memcpy(mxmhead.panpos, "\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80", 32); break;
case 1: memcpy(mxmhead.panpos, "\x00\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF\x00", 32); break;
case 2: memcpy(mxmhead.panpos, "\x40\xC0\xC0\x40\x40\xC0\xC0\x40\x40\xC0\xC0\x40\x40\xC0\xC0\x40\x40\xC0\xC0\x40\x40\xC0\xC0\x40\x40\xC0\xC0\x40\x40\xC0\xC0\x40", 32); break;
case 3: memcpy(mxmhead.panpos, "\x00\xFF\x00\xFF\x00\xFF\x00\xFF\x00\xFF\x00\xFF\x00\xFF\x00\xFF\x00\xFF\x00\xFF\x00\xFF\x00\xFF\x00\xFF\x00\xFF\x00\xFF\x00\xFF", 32); break;
case 4: memcpy(mxmhead.panpos, "\x40\xC0\x40\xC0\x40\xC0\x40\xC0\x40\xC0\x40\xC0\x40\xC0\x40\xC0\x40\xC0\x40\xC0\x40\xC0\x40\xC0\x40\xC0\x40\xC0\x40\xC0\x40\xC0", 32); break;
case 5: memcpy(mxmhead.panpos, "\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80", 32); break;
}
if (head2.freqtab&1)
{
mxmhead.lowpitch=-72*256;
mxmhead.highpitch=96*256;
}
else
{
mxmhead.lowpitch=107;
mxmhead.highpitch=438272;
}
write(wf, &mxmhead, sizeof(mxmhead));
write(wf, &head2.ord, 256);
write(wf, &insofs, 512);
write(wf, &patofs, 1024);
unsigned long patstartpos=tell(file);
for (i=0; i<head2.patnum; i++)
{
struct
{
unsigned long len;
unsigned char ptype;
unsigned short rows;
unsigned short patdata;
} pathead;
read(file, &pathead, sizeof(pathead));
lseek(file, pathead.patdata+pathead.len-sizeof(pathead), SEEK_CUR);
}
memset(insreloc, 0xFF, 256);
insreloc[0]=0;
char useifx[5];
memset(useifx, 0, 5);
int sampnum=0;
int curins=0;
for (i=0; i<head2.insnum; i++)
{
struct
{
unsigned long size;
char name[22];
char type;
unsigned short samp;
} ins1;
read(file, &ins1, sizeof(ins1));
if (!ins1.samp)
{
lseek(file, ins1.size-sizeof(ins1), SEEK_CUR);
continue;
}
struct
{
unsigned long shsize;
unsigned char snum[96];
unsigned short venv[12][2];
unsigned short penv[12][2];
unsigned char vnum, pnum;
unsigned char vsustain, vloops, vloope, psustain, ploops, ploope;
unsigned char vtype, ptype;
unsigned char vibtype, vibsweep, vibdepth, vibrate;
unsigned short volfade;
unsigned short res;
} ins2;
read(file, &ins2, sizeof(ins2));
lseek(file, ins1.size-sizeof(ins1)-sizeof(ins2), SEEK_CUR);
struct
{
unsigned long sampnum;
unsigned char snum[96];
unsigned short volfade;
unsigned char vibtype, vibsweep, vibdepth, vibrate;
unsigned char vnum, vsustain, vloops, vloope;
unsigned short venv[12][2];
unsigned char pnum, psustain, ploops, ploope;
unsigned short penv[12][2];
unsigned char res[46];
} mxmins;
struct
{
unsigned short gusstartl;
unsigned char gusstarth;
unsigned short gusloopstl;
unsigned char gusloopsth;
unsigned short gusloopendl;
unsigned char gusloopendh;
unsigned char gusmode;
unsigned char vol;
unsigned char pan;
unsigned short relpitch;
unsigned char res[2];
} mxmsamp[16];
unsigned char sampreloc[16];
memset(sampreloc, 0xFF, 16);
int cursmp=0;
for (j=0; j<ins1.samp; j++)
{
struct
{
unsigned long samplen;
unsigned long loopstart;
unsigned long looplen;
unsigned char vol;
signed char finetune;
unsigned char type;
unsigned char pan;
signed char relnote;
unsigned char res;
unsigned char name[22];
} samp;
read(file, &samp, sizeof(samp));
lseek(file, ins2.shsize-sizeof(samp), SEEK_CUR);
if (!samp.samplen)
continue;
if (samp.loopstart>samp.samplen)
samp.type&=~3;
if ((samp.loopstart+samp.looplen)>samp.samplen)
samp.looplen=samp.samplen-samp.loopstart;
if (!samp.looplen)
samp.type&=~3;
if ((samp.samplen>262*1024)&&(samp.type&16))
{
cputs("16 bit sample too long\r\n");
return;
}
if ((samp.type&16)&&((samp.samplen|samp.loopstart|samp.looplen)&1))
{
cputs("16 bit sample point odd\r\n");
return;
}
if (samp.samplen>1024*1024)
{
cputs("sample too long\r\n");
return;
}
mxmsamp[cursmp].relpitch=samp.relnote*256+samp.finetune*2;
mxmsamp[cursmp].vol=samp.vol;
mxmsamp[cursmp].pan=samp.pan;
mxmsamp[cursmp].gusmode=((samp.type&16)?0x04:0x00)|((samp.type&3)?(((samp.type&3)==2)?0x18:0x08):0x00);
mxmsamp[cursmp].gusstartl=samp.samplen;
mxmsamp[cursmp].gusstarth=samp.samplen>>16;
mxmsamp[cursmp].gusloopstl=samp.loopstart;
mxmsamp[cursmp].gusloopsth=samp.loopstart>>16;
mxmsamp[cursmp].gusloopendl=samp.loopstart+samp.looplen;
mxmsamp[cursmp].gusloopendh=(samp.loopstart+samp.looplen)>>16;
memset(mxmsamp[cursmp].res, 0, sizeof(mxmsamp->res));
sampreloc[j]=cursmp++;
if (samp.type&16)
useifx[4]=1;
}
if (!cursmp)
continue;
insofs[curins]=tell(wf);
insreloc[i+1]=++curins;
memset(&mxmins, 0, sizeof(mxmins));
mxmins.sampnum=cursmp;
for (j=0; j<96; j++)
mxmins.snum[j]=sampreloc[ins2.snum[j]];
mxmins.volfade=0xFFFF;
mxmins.vnum=0;
mxmins.vsustain=0xFF;
mxmins.vloops=0;
mxmins.vloope=0xFF;
mxmins.venv[0][0]=0;
mxmins.venv[0][1]=64;
mxmins.pnum=0;
mxmins.psustain=0xFF;
mxmins.ploops=0;
mxmins.ploope=0xFF;
mxmins.penv[0][0]=0;
mxmins.penv[0][1]=32;
mxmins.volfade=ins2.volfade; // ??????????????????????????????????????
if (ins2.vtype&1)
{
useifx[0]=1;
mxmins.vnum=ins2.vnum-1;
for (j=0; j<mxmins.vnum; j++)
{
mxmins.venv[j][0]=ins2.venv[j+1][0]-ins2.venv[j][0];
mxmins.venv[j][1]=ins2.venv[j][1];
}
mxmins.venv[mxmins.vnum][0]=0;
mxmins.venv[mxmins.vnum][1]=ins2.venv[mxmins.vnum][1];
if (ins2.vtype&2)
mxmins.vsustain=ins2.vsustain;
if (ins2.vtype&4)
{
if (ins2.vloops<=ins2.vnum)
mxmins.vloops=ins2.vloops;
mxmins.vloope=ins2.vloope;
}
mxmins.volfade=ins2.volfade;
}
if (ins2.ptype&1)
{
useifx[1]=1;
mxmins.pnum=ins2.pnum-1;
for (j=0; j<mxmins.pnum; j++)
{
mxmins.penv[j][0]=ins2.penv[j+1][0]-ins2.penv[j][0];
mxmins.penv[j][1]=ins2.penv[j][1];
}
mxmins.penv[mxmins.pnum][0]=0;
mxmins.penv[mxmins.pnum][1]=ins2.penv[mxmins.pnum][1];
if (ins2.ptype&2)
mxmins.psustain=ins2.psustain;
if (ins2.ptype&4)
{
if (ins2.ploops<=ins2.pnum)
mxmins.ploops=ins2.ploops;
mxmins.ploope=ins2.ploope;
}
}
if (ins2.vibdepth)
{
useifx[2]=1;
if (ins2.vibtype!=0)
useifx[3]=1;
mxmins.vibtype=(ins2.vibtype==1)?2:(ins2.vibtype==2)?3:(ins2.vibtype==3)?1:0;
mxmins.vibsweep=ins2.vibsweep;
mxmins.vibdepth=ins2.vibdepth;
mxmins.vibrate=ins2.vibrate;
}
write(wf, &mxmins, sizeof(mxmins));
for (j=0; j<cursmp; j++)
{
sampinfo[sampnum].srcofs=tell(file);
sampinfo[sampnum].dstofs=tell(wf);
sampinfo[sampnum].len=mxmsamp[j].gusstartl+(mxmsamp[j].gusstarth<<16);
sampinfo[sampnum].loopstart=mxmsamp[j].gusloopstl+(mxmsamp[j].gusloopsth<<16);
sampinfo[sampnum].loopend=mxmsamp[j].gusloopendl+(mxmsamp[j].gusloopendh<<16);
sampinfo[sampnum].type=mxmsamp[j].gusmode;
write(wf, &mxmsamp[j], sizeof(*mxmsamp));
lseek(file, sampinfo[sampnum].len, SEEK_CUR);
sampnum++;
}
}
mxmhead.insnum=curins;
if (!curins)
{
cputs("no instruments\r\n");
return;
}
lseek(file, patstartpos, SEEK_SET);
char usefx[52];
char usevfx[52];
memset(usefx, 0, 52);
memset(usevfx, 0, 16);
for (i=0; i<head2.patnum; i++)
{
struct
{
unsigned long len;
unsigned char ptype;
unsigned short rows;
unsigned short patdata;
} pathead;
read(file, &pathead, sizeof(pathead));
lseek(file, pathead.len-sizeof(pathead), SEEK_CUR);
read(file, patbuf1, pathead.patdata);
memset(patbuf1+pathead.patdata, 0x80, 0x10000-pathead.patdata);
unsigned char *pp1=patbuf1;
unsigned char *pp2=patbuf1+0x10000;
*(unsigned long*)pp2=pathead.rows;
pp2+=4;
for (j=0; j<pathead.rows; j++)
{
for (k=0; k<head2.channum; k++)
{
unsigned char note=0;
unsigned char ins=0;
unsigned char vol=0;
unsigned char cmd=0;
unsigned char data=0;
unsigned char pack=*pp1++;
if (pack&0x80)
{
if (pack&0x01)
note=*pp1++;
if (pack&0x02)
ins=*pp1++;
if (pack&0x04)
vol=*pp1++;
if (pack&0x08)
cmd=*pp1++;
if (pack&0x10)
data=*pp1++;
}
else
{
note=pack;
ins=*pp1++;
vol=*pp1++;
cmd=*pp1++;
data=*pp1++;
}
if (cmd>=36)
cmd=data=0;
if (cmd==0xE)
{
cmd=36+(data>>4);
data&=0xF;
}
pack=0;
if (note||ins)
pack|=0x20;
if (vol)
pack|=0x40;
if (cmd||data)
pack|=0x80;
if (pack)
{
pack|=k;
*pp2++=pack;
if (pack&0x20)
{
*pp2++=note;
*pp2++=insreloc[ins];
}
if (pack&0x40)
{
*pp2++=vol;
usevfx[vol>>4]=1;
}
if (pack&0x80)
{
usefx[cmd]=1;
*pp2++=cmd;
*pp2++=data;
}
}
}
*pp2++=0;
}
patofs[i]=tell(wf);
write(wf, patbuf1+0x10000, pp2-patbuf1-0x10000);
}
if (addcleanpat)
{
patofs[head2.patnum]=tell(wf);
*patbuf1=64;
memset(patbuf1+1, 0, 67);
write(wf, patbuf1, 68);
}
long memsize8=0;
long memsize16=0;
for (i=0; i<sampnum; i++)
{
if (sampinfo[i].type&4)
memsize16+=(sampinfo[i].len>>1)+1;
else
memsize8+=sampinfo[i].len+1;
}
memsize8=(memsize8+15)&~15;
memsize16=(memsize16+7)&~7;
mxmhead.samples8=memsize8;
mxmhead.samples16=memsize16;
mxmhead.sampstart=tell(wf);
if ((memsize8+2*memsize16)>1024*1024)
{
cputs("samples too long\r\n");
return;
}
signed char *mem8=new signed char [memsize8];
memset(mem8, 0, memsize8);
unsigned long guspos=0;
for (i=0; i<sampnum; i++)
{
if (sampinfo[i].type&4)
continue;
lseek(file, sampinfo[i].srcofs, SEEK_SET);
read(file, mem8+guspos, sampinfo[i].len);
signed char d=0;
for (j=0; j<sampinfo[i].len; j++)
mem8[guspos+j]=d+=mem8[guspos+j];
lseek(wf, sampinfo[i].dstofs, SEEK_SET);
unsigned long b,a=guspos;
write(wf, &a, 3);
mem8[guspos+sampinfo[i].len]=mem8[guspos+sampinfo[i].len-1];
if (sampinfo[i].type&8)
{
b=a+sampinfo[i].loopstart;
write(wf, &b, 3);
b=a+sampinfo[i].loopend;
write(wf, &b, 3);
if (!(sampinfo[i].type&16))
mem8[guspos+sampinfo[i].loopend]=mem8[guspos+sampinfo[i].loopstart];
}
else
{
b=0;
write(wf, &b, 3);
b=a+sampinfo[i].len;
write(wf, &b, 3);
}
guspos+=sampinfo[i].len+1;
}
lseek(wf, 0, SEEK_END);
if (dodelta)
{
signed char l=0;
for (i=0; i<memsize8; i++)
{
signed char delta=mem8[i]-l;
l=mem8[i];
mem8[i]=delta;
}
}
write(wf, mem8, memsize8);
delete mem8;
signed short *mem16=new signed short [memsize16];
memset(mem16, 0, memsize16*2);
guspos=0;
for (i=0; i<sampnum; i++)
{
if (!(sampinfo[i].type&4))
continue;
sampinfo[i].loopstart>>=1;
sampinfo[i].loopend>>=1;
sampinfo[i].len>>=1;
lseek(file, sampinfo[i].srcofs, SEEK_SET);
read(file, mem16+guspos, sampinfo[i].len*2);
signed short d=0;
for (j=0; j<sampinfo[i].len; j++)
mem16[guspos+j]=d+=mem16[guspos+j];
lseek(wf, sampinfo[i].dstofs, SEEK_SET);
unsigned long b,a=((guspos+(memsize8>>1))&0x1FFFF)|0x20000|(((guspos+(memsize8>>1))<<1)&0xC0000);
write(wf, &a, 3);
mem16[guspos+sampinfo[i].len]=mem16[guspos+sampinfo[i].len-1];
if (sampinfo[i].type&8)
{
b=a+sampinfo[i].loopstart;
write(wf, &b, 3);
b=a+sampinfo[i].loopend;
write(wf, &b, 3);
if (!(sampinfo[i].type&16))
mem16[guspos+sampinfo[i].loopend]=mem16[guspos+sampinfo[i].loopstart];
}
else
{
b=0;
write(wf, &b, 3);
b=a+sampinfo[i].len;
write(wf, &b, 3);
}
guspos+=sampinfo[i].len+1;
}
lseek(wf, 0, SEEK_END);
if (dodelta)
{
signed short l16=0;
for (i=0; i<memsize16; i++)
{
signed short delta=mem16[i]-l16;
l16=mem16[i];
mem16[i]=delta;
}
}
write(wf, mem16, memsize16*2);
delete mem16;
lseek(wf, 0, SEEK_SET);
write(wf, &mxmhead, sizeof(mxmhead));
write(wf, &head2.ord, 256);
write(wf, &insofs, 512);
write(wf, &patofs, 1024);
lseek(wf, 0, SEEK_END);
close(wf);
close(file);
cputs(dpath);
cputs(" written\r\n");
if (include)
{
wf=open(ipath, O_WRONLY|O_BINARY|O_CREAT|O_TRUNC, S_IREAD|S_IWRITE);
writestrbool(wf, "USEARPEGGIO", usefx[0]);
writestrbool(wf, "USEPORTA", usefx[1]||usefx[2]);
writestrbool(wf, "USEPORTANOTE", usefx[3]);
writestrbool(wf, "USEVIBRATO", usefx[4]);
writestrbool(wf, "USEPORTAVOL", usefx[5]);
writestrbool(wf, "USEVIBRATOVOL", usefx[6]);
writestrbool(wf, "USETREMOLO", usefx[7]);
writestrbool(wf, "USEPAN", usefx[8]);
writestrbool(wf, "USEOFFSET", usefx[9]);
writestrbool(wf, "USEVOLSLIDE", usefx[10]);
writestrbool(wf, "USEJUMP", usefx[11]);
writestrbool(wf, "USEVOL", usefx[12]);
writestrbool(wf, "USEBREAK", usefx[13]);
writestrbool(wf, "USESPEED", usefx[15]);
writestrbool(wf, "USEGVOL", usefx[16]);
writestrbool(wf, "USEGVOLSLIDE", usefx[17]);
writestrbool(wf, "USEKEYOFFCMD", usefx[20]);
writestrbool(wf, "USEENVPOS", usefx[21]);
writestrbool(wf, "USEPANSLIDE", usefx[25]);
writestrbool(wf, "USEMRETRIG", usefx[27]);
writestrbool(wf, "USESYNC", usefx[28]||usefx[36+15]);
writestrbool(wf, "USETREMOR", usefx[29]);
writestrbool(wf, "USEXFPORTA", usefx[33]);
writestrbool(wf, "USEFPORTA", usefx[36+1]||usefx[36+2]);
writestrbool(wf, "USEGLISSANDO", usefx[36+3]);
writestrbool(wf, "USEVIBTYPE", usefx[36+4]);
// writestrbool(wf, "USEFINETUNE", usefx[36+5]);
writestrbool(wf, "USEPATLOOP", usefx[36+6]);
writestrbool(wf, "USETREMTYPE", usefx[36+7]);
writestrbool(wf, "USESPAN", usefx[36+8]);
writestrbool(wf, "USERETRIG", usefx[36+9]);
writestrbool(wf, "USEFVOLSLIDE", usefx[36+10]||usefx[36+11]);
writestrbool(wf, "USENOTECUT", usefx[36+12]);
writestrbool(wf, "USEDELAY", usefx[36+13]);
writestrbool(wf, "USEPATDELAY", usefx[36+14]);
write(wf, "\r\n", 2);
writestrbool(wf, "USEVVOL", usevfx[1]|usevfx[2]|usevfx[3]|usevfx[4]|usevfx[5]);
writestrbool(wf, "USEVVOLSLIDE", usevfx[6]|usevfx[7]);
writestrbool(wf, "USEVFVOLSLIDE", usevfx[8]|usevfx[9]);
writestrbool(wf, "USEVVIBRATE", usevfx[10]);
writestrbool(wf, "USEVVIBRATO", usevfx[11]);
writestrbool(wf, "USEVPAN", usevfx[12]);
writestrbool(wf, "USEVPANSLIDE", usevfx[13]|usevfx[14]);
writestrbool(wf, "USEVPORTANOTE", usevfx[15]);
write(wf, "\r\n", 2);
writestrbool(wf, "USEVOLENV", useifx[0]);
writestrbool(wf, "USEPANENV", useifx[1]);
writestrbool(wf, "USEAUTOVIBRATO", useifx[2]);
writestrbool(wf, "USEAUTOVIBRATOTYPE", useifx[3]);
writestrbool(wf, "USE16BIT", useifx[4]);
write(wf, "\r\n", 2);
writestrbool(wf, "USEDELTASAMP", dodelta);
writestrbool(wf, "USEFREQTAB", head2.freqtab&1);
close(wf);
cputs(ipath);
cputs(" written\r\n");
}
}